Crackme3 by WiteG - deep blue vs ged_ by ged_

RC4, RIPEMD-128, problem konika szachowego (7x32)

Cm jest spakowane pecompactem, ale na razie si tym nie przejmujemy... Wida, e nie ma gdzie wpisa seriala, wic bpx createfilea do "d esp->4; p ret" i odpalamy ponownie. Crackme3.wtg.. hmm.. oryginalna nazwa :)

pec1:00402A8E                 push    0
pec1:00402A90                 push    ds:hFile
pec1:00402A96                 call    j_GetFileSie
pec1:00402A9B                 cmp     eax, 20h
pec1:00402A9E                 jnz     short loc_0_402B00

Nasz keyfile ma mie 32 bajty

pec1:00402AA0                 push    0
pec1:00402AA2                 push    offset dword_0_4040A8
pec1:00402AA7                 push    eax
pec1:00402AA8                 push    40401Ch
pec1:00402AAD                 push    ds:hFile
pec1:00402AB3                 call    j_ReadFile

40401Ch trzyma zawarto keyfile

pec1:00402AB8                 call    BF_INIT

Tutaj inicjowany jest blowfish. Kluczem jest kawaek kodu, ale to nas na razie nie interesuje :). Skd wiem, e to blowfish? Look w gb procki:

pec1:00402B22                 mov     ecx, 412h
pec1:00402B27                 mov     esi, offset sbox
pec1:00402B2C                 mov     edi, offset dword_0_404427

Co to jest, ten sbox?

pec1:004019AB sbox           dd 243F6A88h, 85A308D3h, 13198A2Eh, 3707344h,
0A4093822h, 299F31D0h, 82EFA98h, 0EC4E6C89h, 452821E6h, 8D01377h,0BE5466CF

To stay sbox blowfisha :). Bierzemy ktr sta, szukamy w rdach jakiego crypto-paku i bingo.. blowfish.c.

Wracajc do gwnej procki..

pec1:00402ABD                 mov     ecx, 4
pec1:00402AC2                 mov     edi, 40401Ch
pec1:00402AC7
pec1:00402AC7 loc_0_402AC7:           ; CODE XREF: pec1:00402ADB j
pec1:00402AC7                 push    ecx
pec1:00402AC8                 mov     eax, [edi]
pec1:00402ACA                 mov     edx, [edi+4]
pec1:00402ACD                 call    BF_CRYPT
pec1:00402AD2                 mov     [edi], eax
pec1:00402AD4                 mov     [edi+4], edx
pec1:00402AD7                 pop     ecx
pec1:00402AD8                 add     edi, 8
pec1:00402ADB                 loop    loc_0_402AC7

Jak atwo si domyli, zawarto keyfile jest deszyfrowana blowfishem.

pec1:00402ADD                 call    RIPEMD

I teraz cay zonk: pierwsze 16 bajtw jest hashowane RIPEMD-128!

pec1:00402AE2            mov     ecx, 4
pec1:00402AE7
pec1:00402AE7 loc_0_402AE7:      ; CODE XREF: pec1:00402AF7 j
pec1:00402AE7            mov     eax, dword ptr ds:aUnregistered+9[ecx*4]
pec1:00402AEE            cmp     eax, ds:dword_0_4040EB[ecx*4]
pec1:00402AF5            jnz     short loc_0_402B00
pec1:00402AF7            loop    loc_0_402AE7

Wynik hasha musi si zgadza z pewn staa wartoci.. jeli si nie zgadza, to wypad :P

pec1:00402AF9                 push    40401Ch
pec1:00402AFE                 jmp     short loc_0_402B05

Jeli jest Ok, to pokazuje si nasz name na statusbarze crackme.
Ok, czyli mamy:

RIPEMD(BLOWFISH(serial)) == staa

Kade dziecko wie, e hasha nie da si odwrci.. wic sprbujmy jaki string, np. "Congratulations ". nie dziaa :) hmm.. co tu musi by nie tak, przecie cm Witka s amliwe. Troch nad tym pomylaem, i doszedem do wniosku, e najlepiej bdzie wytpi jak wskazwk od samego autora :-). Dostaem hinta: crackme jest spakowane pecomapctem. niewiele :). Pierwsze co naley zrobi to skoowa unpaker www.exetools.cjb.net (czy jakikolwiek inny z toolami). Rozpakowalimy cm i znw dajemy bpx createfilea do "d esp->4; p ret". I co wida?

pec1:00402692                 push    0
pec1:00402694                 push    ds:hFile
pec1:0040269A                 call    j_GetFileSie
pec1:0040269F                 cmp     eax, 80h
pec1:004026A4                 jnz     short loc_0_40271C

To rozumiem :). Po napisaniu kg, WiteG mnie owieci: pecompact umoliwia pisanie pluginw. W cm by zastosowany plugin wykrywajcy SI. Jeli SI jest aktywny, to wykonywana jest procka z RIPEMD, jeli nie, to odpalany jest powyszy kawaek kodu. Prawdziwe kf ma mie 128 bajtw.

Teraz zaczynaj si schody. Nie bd wkleja kawakw deadlistingu jak do tej pory, nie jest te celem tego txtu wyjanianie, jak naley rozpoznawa algo. kryptograficzne. Odtd czysta teoria, bez zbdnych wyjanie.

Najpierw inicjowany jest RC4, klucz stanowi greetsy. Nastpnie deszyfrowane jest pierwsze 10h bajtw. Z wyniku liczony jest hash RIPE. Ten hash jest kluczem do deszyfrowania pozostaych 70h bajtw. Odszyfrowane bajty przechodz przez pewn prock (sub_0_4027E5), ktra w jaki tam sposb decyduje o ich poprawnoci. Nastpnie te 70h bajtw jest wykorzystywane jako klucz do deszyfrowania pierwszych 10h bajtw i to jest nasz name :). Ok, wyglda na zagmatwane, ale nie jest ;)
RC4(10h bajtw, greety)  <- deszyfrujemy pierwsze 10h bajtw greetami
hash=RIPEMD(10h bajtw)  <- liczymy hash z odszyfrowanych wczeniej bajtw
RC4(70h bajtw, hash)    <- deszyfrujemy hashem pozostae 70h bajtw
sub_0_4027E5(70h bajtw) <- sprawdzamy czy s poprawne
RC4(10h bajtw, 70h bajtw) <- znw deszyfrujemy pierwsze 10h bajtw

I powinno wyj name :). Jak to odwrci?

1. najpierw trzeba sobie wybra name :-),
2. potem odszyfrowa je 70h bajtami (sub_0_4027E5),
3. odszyfrowa wynik za pomoc greetw (mamy pierwsze 16 bajtw)
4. policzy hash RIPE wyniku z punktu 2
5. odszyfrowa 70h bajtw (sub_0_4027E5) tym hashem
6. viola :-)

Mam nadziej, e wystarczajco jasno :)

Kto mgby sobie pomyle, e to jush koniec i odwrcenie sub_0_4027E5 to buka z masem, tym bardziej, e ta procka wyglda do niepozornie - adnych xorow, tablic etc., tyle par skokw :). Nie naley ocenia po pozorach :P. Caa ta procka to implementacja problemu konika szachowego dla szachownicy 7x32. Naley poda sekwencj ruchw, tak aby konik stan na kadym polu tylko raz. Euler poda ten problem 200 lat temu i od tamtej pory matematycy wykminili tylko 1 *szybki* sposb.

Najpierw ofkoz zaczy si poszukiwania po starych ksikach do pascala.

Znalazem implementacj algo. rekurencyjnego, ale dla duych szachownic jest bezuyteczny, wic nie ma go nawet co zamieszcza ;p. Oglna idea jest taka: wykonuj ruchy konikiem jak szybko si da, jeli trafisz na lep uliczk, cofnij kilka ruchw i zacznij od nowa. Do gupie, ale skuteczne dla maych szachownic ;).

Uznaem, e trzeba wymyli co innego i po dugich medytacjach wpadem na taki pomys: mona podzieli ca szachownic 7x32 na kilka mniejszych, rozwiza je osobno, a pomidzy nimi doda tylko 'przejcia' z jednej do drugiej. Jak si pniej okazao, pomys nie by gupi - matematycy wpadli na to rozwizanie zupenie niedawno :). Tym sposobem udao mi si rozwiza ca szachownic BEZ JEDNEGO POLA !!! !@#!@# Trik tkwi w tym, e w pierwszym ruchu PIERWSZE POLE NIE JEST GASZONE, co uniemoliwiao zastosowanie mojej metody.. Wtedy pomylaem, e pierdole takie cm i daem spokj :P. Ale ofkoz crackme jest amliwe, tutaj HATS OFF dla Witka za design i za cierpliwo z jak przekonywa mnie, e istnieje rozwizanie :). Po paru miechach znw zaczem poszukiwania i dotarem do - http://mathworld.wolfram.com/ - kto korzysta z mathematici, wie o co chodzi :). Wklepaem chess i bingo, algo. Warnsdorffa. Algo jest genialnie proste: kolejne pozycje konika wybierane s na podstawie prostego kryterium: kade dostpne w jednym ruchu pole dostaje liczb punktw odpowiadajc liczbie moliwych ruchw z tego pola. Wybierana jest pozycja o najmniejszej liczbie punktw. W ten sposb, pola ktrym grozi izolacja, s odwiedzane najszybciej. Implementacja w c (lcc), rda doczone do arta.

greets:
lipski, witeg, tymon, sfistack, sachy, tomkol, virs, divine, cybult, ronin, haxmen, chendler, panther, htbteam, aaocg, thelo0p, #crackpl, cip-party-team :)

ged_//tkm!
ged@hoga.pl